package com.blog.cmrpersonalblog.dto.ranking.requset;

import com.blog.cmrpersonalblog.common.BasePageRequest;
import com.blog.cmrpersonalblog.enums.RankingDimension;
import com.blog.cmrpersonalblog.enums.RankingType;
import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.Min;
import lombok.Data;
import lombok.EqualsAndHashCode;

/**
 * 榜单查询请求DTO
 */
@Data
@EqualsAndHashCode(callSuper = true)
public class RankingRequest extends BasePageRequest {

    /**
     * 构造函数，设置默认值
     */
    public RankingRequest() {
        super();
        // 榜单默认每页10条，最大50条
        this.setSize(10L);
    }

    /**
     * 榜单类型
     * ARTICLE - 文章榜
     * AUTHOR - 作者榜
     * COLLECTION - 收藏榜
     */
    private String rankingType = RankingType.ARTICLE.getCode();

    /**
     * 榜单维度
     * OVERALL - 综合榜
     * CATEGORY - 分类榜
     */
    private String dimension = RankingDimension.OVERALL.getCode();

    /**
     * 分类ID（当dimension为CATEGORY时必填）
     */
    private Long categoryId;

    /**
     * 是否只获取TOP N（不分页）
     */
    private Boolean topOnly = false;

    /**
     * TOP N的数量（当topOnly为true时有效）
     */
    @Min(value = 1, message = "TOP数量不能小于1")
    @Max(value = 50, message = "TOP数量不能超过50")
    private Integer topN = 10;
    
    /**
     * 验证请求参数
     */
    public void validate() {
        // 验证榜单类型
        try {
            RankingType.fromCode(rankingType);
        } catch (IllegalArgumentException e) {
            throw new IllegalArgumentException("无效的榜单类型: " + rankingType);
        }

        // 验证榜单维度
        try {
            RankingDimension dim = RankingDimension.fromCode(dimension);
            // 如果是分类榜，必须提供分类ID
            if (dim == RankingDimension.CATEGORY && categoryId == null) {
                throw new IllegalArgumentException("分类榜必须提供分类ID");
            }
        } catch (IllegalArgumentException e) {
            throw new IllegalArgumentException("无效的榜单维度: " + dimension);
        }
    }

    /**
     * 获取榜单类型枚举
     */
    public RankingType getRankingTypeEnum() {
        return RankingType.fromCode(rankingType);
    }

    /**
     * 获取榜单维度枚举
     */
    public RankingDimension getDimensionEnum() {
        return RankingDimension.fromCode(dimension);
    }

    /**
     * 获取安全的每页大小（榜单最大50条）
     */
    @Override
    public Long getSafeSize() {
        if (getSize() == null || getSize() < 1) {
            return 10L;
        }
        return getSize() > 50 ? 50L : getSize();
    }
}

